import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int[] arr={1,2,3};
        int[] arr1={1,5,2,3,6,9,5,4,7,3,1,8};
        fun1(arr1);
        System.out.println(Arrays.toString(arr1));
        transform(arr);
        System.out.println(Arrays.toString(arr));
        System.out.println(avg(arr));
    }
    //调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序。
    //
    //如数组：[1,2,3,4,5,6]
    //
    //调整后可能是：[1, 5, 3, 4, 2, 6]
    public static void fun1(int[] arr){
        int left=0;
        int right=arr.length-1;
        while(left<=right){
            while(left<=right&&arr[left]%2!=0){
                left++;
            }
            while(left<=right&&arr[right]%2==0){
                right--;
            }
            if(left<=right){
                int tmp=arr[left];
                arr[left]=arr[right];
                arr[right]=tmp;
            }else break;
        }
    }

    //实现一个方法 avg, 以数组为参数, 求数组中所有元素的平均值(注意方法的返回值类型).
    public static double avg(int[] arr){
        int sum=0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return 1.0*sum/arr.length;
    }


    //实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 ,
    // 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}
    public static void transform(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            arr[i]*=2;
        }
    }

    public static void main10(String[] args) {
        System.out.println(func10(3));
    }
    //递归求 N 的阶乘
    public static int func10(int n){
        if(n==1) return 1;
        else return n*func10(n-1);
    }

    public static void main9(String[] args) {
        System.out.println(max(5, 3));
        System.out.println(max(3.1, 4.2, 1.5));
        //System.out.println(func8(9));
        /*System.out.println(func9(5, 3));
        System.out.println(func9(1.5, 2.2, 3.4));*/
    }
    //在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值？
    public static int max(int a,int b){
        return a>b?a:b;
    }
    public static double max(double a,double b,double c){
        double x=a>b?a:b;
        return x>c?x:c;
    }

    //在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static int func9(int a,int b){
        return a+b;
    }
    public static double func9(double a,double b,double c){
        return a+b+c;
    }

    //求斐波那契数列的第n项。(迭代实现)
    public static int func8(int n){
        if(n==1 || n==2) {
            return 1;
        }
        /*else{
            return func8(n-1)+func8(n-2);
        }*/
        int a=1,b=1,sum=0;
        for(int i=3;i<=n;i++){
            sum=a+b;
            b=a;
            a=sum;
        }
        return sum;
    }

    public static void main6(String[] args) {
        System.out.println(func7(5));
    }
    //求1！+2！+3！+4！+........+n!的和
    public static int func7(int n){
        int sum=0;
        while(n>0){
            sum+=func6(n--);
        }
        return sum;
    }
    //求 N 的阶乘  。
    public static int func6(int n){
        int sum=1;
        while(n>0){
            sum*=n;
            n--;
        }
        return sum;
    }
    public static void main5(String[] args) {
        int a=1,b=2,c=3;
        System.out.println(max2(a,b));
        System.out.println(max3(a,b,c));
    }

    //创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //   要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
    public static int max2(int a,int b){
        return a>b?a:b;
    }
    public static int max3(int a,int b,int c){
        int x=max2(a,b);
        return x>c?x:c;
    }
    public static void main4(String[] args) {
        func5();
    }

    /*
     *给定两个数，求这两个数的最大公约数
    例如：
    输入：20 40
    输出：20 */
    public static void func5(){
        System.out.println("请输入两个数：");
        Scanner scanner=new Scanner(System.in);
        int num1= scanner.nextInt();
        int num2= scanner.nextInt();
        for (int i = (num1>num2?num2:num1); i >0; i--) {
            if(num1%i==0&&num2%i==0){
                System.out.println("最大公约数为"+i);
                return;
            }
        }
    }



    //获取一个数二进制序列中所有的偶数位和奇数位， 分别输出二进制序列
    public static void func4(){
        Scanner scanner=new Scanner(System.in);
        int num;
        System.out.print("请输入一个十进制整数：");
        num=scanner.nextInt();
        int[] arr=new int[32];
        int[] a=new int[32];//奇数位
        int[] b=new int[32];//偶数位
        int i=0;
        if(num==0){
            arr[i++]=0;
        }else{
            while(num!=0){
                arr[i++]=num%2;
                num/=2;
            }
        }
        int j=0,k=0,pos=0;
        for(;pos<i;pos++){
            if((pos+1)%2==1){//奇数位
                a[k++]=arr[pos];
            }else{
                b[j++]=arr[pos];
            }
        }
        System.out.println("原二进制数：");
        for (pos = i-1; pos >=0; pos--) {
            System.out.print(arr[pos]+" ");
        }
        System.out.println();
        System.out.println("奇数位：");
        for (pos = k-1; pos >=0; pos--) {
            System.out.print(a[pos]+" ");
        }
        System.out.println();
        System.out.println("偶数位：");
        for (pos = j-1; pos >=0; pos--) {
            System.out.print(b[pos]+" ");
        }
    }

    //编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,密码错误， 可以重新输入，最多输入三次。三次均错，则提示退出程序
    public static void func2(){
        String s="12345";
        System.out.println("请输入五位密码：");
        int k=3;
        while(k!=0){
            Scanner scanner =new Scanner(System.in);
            String s1=scanner.nextLine();
            if(s1.equals(s)){
                System.out.println("登陆成功");
                break;
            }else{
                System.out.println("密码错误，重新输入");
                k--;
            }
        }
    }


    //输出一个整数的每一位，如：123的每一位是3，2，1
    public static void func3(){
        Scanner scanner=new Scanner(System.in);
        int k=scanner.nextInt();
        while(k!=0){
            System.out.print(k%10+" ");
            k/=10;
        }
    }

    //X形图案
    public static void main3() {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            for(int i=1;i<=a;i++){
                for(int j=1;j<=a;j++){
                    if(i==j||j==(a+1-i)){
                        System.out.print('*');
                    }else{
                        System.out.print(' ');
                    }
                }
                System.out.println();
            }
        }
        in.close();
    }
    public static void main2(String[] args) {
        //System.out.println(func1());
        Random random=new Random();
        int r= random.nextInt(100)+50;
        game(r);
    }

    //完成猜数字游戏   ，用户输入数字，判断该数字是大于，小于，还是等于随机生成的数字，等于的时候退出程序。
    public static void game(int r){
        System.out.println("请输入一个[50,150]的数字：");
        Scanner scanner=new Scanner(System.in);
        int k=scanner.nextInt();
        if(k>r){
            System.out.println("猜大了，重新猜");
            game(r);
        } else if (k<r) {
            System.out.println("猜小了，重新猜");
            game(r);
        }else{
            System.out.println("猜对了");
            return;
        }
        scanner.close();
    }

    //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
    public static double func1(){
        double k=1;
        double sum=0;
        /*int flg = 1;
        for (int i = 1; i <= 100; i++) {
            sum += 1.0/i * flg;
         flg = -flg;
        }*/
        for(;k<=100;k++){
            if(k%2!=0){
                sum+=1/k;
            }else{
                sum-=1/k;
            }
        }
        return sum;
    }

    public static int num9(int k){
        int num=0;
        while(k!=0){
            if(k%10==9) num++;
            k/=10;
        }
        return num;
    }
    public static void main1(String[] args) {

        //1~100中数字9的个数
        int k=1;
        int count=0;
        for(;k<=100;k++) {
            count+=num9(k);
        }
        /*for (int i = 1; i <= 100; i++) {
        if(i % 10 == 9) {//判断个位的9
            count++;
        }
        if(i/10 == 9) {
            count++;//判断十位的9
        }
    }*/
        System.out.println("数字9的个数为"+count);
    }
}